/**
 * 面试题 写函数
 * js 中 instanceof 运算符:用于判断构造函数的prototype属性是否出现在第一个参数对象的原型链上
 * a.__proto__ -> == b.prototype  b是a的原型对象
 * a.__proto__.__proto__.__proto__... -> b.prototype  b是a原型链上的对象
 * @func instanceof 实现
 * @param a(实例)对象 , b 对象
 * @return boolean
 */
function myInstanceof(a, b) {
    let proto = Object.getPrototypeOf(a);//方法用于获取指定对象的原型对象（也就是a.__proto__的指向）
    let prototype = b.prototype;
    // if (proto == b.prototype) return true;
    // else return false;
    while (true) {
        if (!proto) return false;// 如果是 null,返回false,退出循环
        if (proto == prototype) return true;
        console.log(proto);
        proto = Object.getPrototypeOf(proto);
        console.log(proto);
    }
}

// 测试用例
function Dog() {// 构造函数
}
function Cat() {
}
// 原型
Dog.prototype.sayHi = function () {
}
const dog = new Dog();// new 构造方法
const cat = null;
console.log(myInstanceof(dog, Dog));// 原型 true
console.log(myInstanceof(dog, Object));// 原型链 true
console.log(dog);
console.log(myInstanceof(dog, Cat));// 原型 false
// console.log(myInstanceof(dog, cat));
// myInstanceof(dog, null);
// console.log(cat);